import net
import transaction
import numpy
import system
import pandas as pd

# 常量
ON_CHAIN_COST = 5 # 上链的时间开销
OFF_CHAIN_COST = 1 # 链下的时间开销
SHARD_TPS = 10 # 每个分片的TPS

# 变量的初始化
# 分片区块链相关
shardNum = 16 # 分片的数量
# pcn相关
nodeNum = 1600 # 节点数量
chDensity = 10 # 通道密度，每个节点平均跟多少人构建通道
steps = 3 # 通道路径的最长步长
poss = 0.5 # pcn的重连概率，WS算法需要
ch_tps = 10 # 每条通道的交易处理能力
ch_life = 100 # 通道寿命

# 交易相关
patchNum = 320000 # 需要处理的交易总数
tx_file_name = 'tx.csv'

# 通道网络的初始化
pcn = net.ws_pcn(nodeNum, chDensity, poss)
print("pcn 创建成功")
# print(pcn)
# print("pcn len = %d, each element = %d" % (len(pcn), len(pcn[0])))

# 构建路径
path = net.pcn_path(pcn, steps)
print("path 计算成功")

# 获取交易
# file = pd.read_csv(tx_file_name)
# txs = file.values.tolist()
txs = transaction.generate_patch_tx(nodeNum, patchNum)
print("交易获取, 数量=", len(txs))
# print(txs)

shardedTx = transaction.transaction_shard(txs, shardNum)
print("交易分片成功")
# print(shardedTx)


# 进行处理过程仿真
print("模拟交易处理")
pcn_tps = (ch_tps * nodeNum * chDensity)/2 # pcn网络的交易处理能力
t1 = system.tx_exec(node_num=nodeNum, snum=shardNum, txs=shardedTx, ledger_tps=SHARD_TPS, path=path, pcn_tps=pcn_tps, ch_life=ch_life, isAllow=0)
t2 = system.tx_exec(node_num=nodeNum, snum=shardNum, txs=shardedTx, ledger_tps=SHARD_TPS, path=path, pcn_tps=pcn_tps, ch_life=ch_life, isAllow=1)

# 输出处理时间
print("传统处理时间 = %d" % t1)
print("新系统的处理时间 = %d" % t2)
'''
'''

# net = net.Net(100)
# net.display()